
package model.persistencia;

import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import model.ITipoPagto;
import model.TipoPagtoModel;

public class TipoPagtoDAO implements IGenericDAO {
    
    
    
    private Statement stmt;
    private Connection con;
    private PreparedStatement ps;
    private BancoDeDados conexaoBanco;
    private ResultSet resultado;
    private ITipoPagto tipoPagto;

    public TipoPagtoDAO(ITipoPagto tipoPagto) {
        conexaoBanco = new BancoDeDados();        
        this.tipoPagto = tipoPagto;
    }
    
    
    @Override
    public void inserir() {
        con = null;
        ps = null;            
        con = conexaoBanco.getConexao();              
        String sql = "INSERT INTO tipopgto(tipopgto_pk, descricao) VALUES (?, ?);";                   
        try {
            ps = con.prepareStatement(sql);            
            ps.setInt(1, tipoPagto.getCodigo());
            ps.setString(2, tipoPagto.getDescricao());                                    
            ps.execute();            
        } catch (SQLException ex) {
            Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no cadastro de Tipo de`Pagamento:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
                stmt.close();
            } catch (SQLException ex) {
                Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }
    }

    @Override
    public void excluir() {
        con = null;
        ps = null;
        con = conexaoBanco.getConexao(); 
        String sql = "DELETE FROM tipopgto WHERE tipopgto_pk = "+tipoPagto.getCodigo()+";";  
        try {
            ps = con.prepareStatement(sql);
            ps.execute();
        } catch (SQLException ex) {
            Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro no no banco no Exclusão de Unidade:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }           
        }           
    }

    @Override
    public void atualizar() {
        con = conexaoBanco.getConexao();
        ps = null;        
        String sql = "UPDATE tipopgto SET descricao=? WHERE tipopgto_pk=?;";        
        try{
            ps = con.prepareStatement(sql);                        
            ps.setString(1, tipoPagto.getDescricao());       
            ps.setInt(2, tipoPagto.getCodigo());
            ps.executeUpdate();            
        }catch(SQLException ex) {
            Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null,  "Erro ao execultar a Atualização de Unidade:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                ps.close();
                con.close();                
            } catch (SQLException ex) {
                Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }       
    }

    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {        
        ArrayList listaTipoPagto = new ArrayList();        
        resultado = null;
        con = null;        
        stmt = null;                           
        con = conexaoBanco.getConexao();                       
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, iPesquisa));                                   
            while(resultado.next()) {
                ITipoPagto tipoPagtoTemp = new TipoPagtoModel();            
                tipoPagtoTemp.setCodigo(resultado.getInt("tipopgto_pk"));                
                tipoPagtoTemp.setDescricao(resultado.getString("descricao"));                
                listaTipoPagto.add(tipoPagtoTemp);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);            
            JOptionPane.showMessageDialog(null, "Erro na Pesquisa de Unidades.\n"+
                    ex.getMessage(),"Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }
        }
        return listaTipoPagto;        
    }   

    @Override
    public String getSQL(int iOpcao, String iPesquisa) {
        String sql = null;        
        switch (iOpcao){
            case ITipoPagto.SQL_PRIMEIRO: sql = "SELECT MIN(tipopgto.tipopgto_pk) as tipopgto_pk FROM public.tipopgto;";break;
            case ITipoPagto.SQL_ANTERIOR: sql = "SELECT MAX(tipopgto.tipopgto_pk) as tipopgto_pk FROM public.tipopgto "
                    + "WHERE tipopgto.tipopgto_pk < "+ iPesquisa +";";break;
            case ITipoPagto.SQL_PROXIMO: sql = "SELECT MIN(tipopgto.tipopgto_pk) as tipopgto_pk FROM public.tipopgto "
                    + "WHERE tipopgto.tipopgto_pk > "+ iPesquisa +";";break;
            case ITipoPagto.SQL_ULTIMO: sql = "SELECT MAX(tipopgto.tipopgto_pk) as tipopgto_pk FROM public.tipopgto;";break;
            case ITipoPagto.SQL_CODIGO: sql = "SELECT tipopgto.tipopgto_pk, tipopgto.descricao FROM public.tipopgto "
                    + "WHERE tipopgto.tipopgto_pk = "+ iPesquisa +";";break;
            case ITipoPagto.SQL_DESCRICAO: sql = "SELECT tipopgto.tipopgto_pk, tipopgto.descricao FROM public.tipopgto "
                    + "WHERE tipopgto.descricao like '%"+ iPesquisa +"%' ORDER BY tipopgto.tipopgto_pk;";break;
            case ITipoPagto.SQL_GETALL: sql = "SELECT tipopgto.tipopgto_pk, tipopgto.descricao FROM public.tipopgto;";break;    
        }        
        return sql;
    }

    @Override
    public int getCodigo(int iOpcao, int iCodigoAtual) {                        
        stmt = null;
        resultado = null;
        con = null;        
        con = conexaoBanco.getConexao();                       
        int codigoEncontrado = -1;        
        try{        
            stmt = (Statement) con.createStatement();
            resultado = stmt.executeQuery(getSQL(iOpcao, String.valueOf(iCodigoAtual)));        
            resultado.next();
            codigoEncontrado = resultado.getInt("tipopgto_pk");
        }catch(SQLException ex) {
            Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro ao execultar a sql de Navegação:\n"+
                    ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
        }finally{
            try {
                con.close();
                stmt.close();
                resultado.close();
            } catch (SQLException ex) {
                Logger.getLogger(TipoPagtoDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, "Erro ao encerrar conexão:\n"+
                        ex.getMessage()+"\n","Mensagem de Erro!",JOptionPane.ERROR_MESSAGE);
            }            
        }        
        return codigoEncontrado;       
    }

    @Override
    public TipoPagtoModel getObject(int id) {
        ArrayList<TipoPagtoModel> listaTipoPagto;
        TipoPagtoModel tipoPagtoTemp;
        listaTipoPagto = pesquisar(ITipoPagto.SQL_CODIGO, String.valueOf(id));
        tipoPagtoTemp = listaTipoPagto.get(0);
        return tipoPagtoTemp;        
    }
    
}
